home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2004 April / Gamestar_61_2004-04_dvdb.iso / DVDStar / Editace / hltp.exe / {app} / Applications / QuArK / plugins / entfgd2qrk.py < prev    next >
Text File  |  2004-01-05  |  23KB  |  636 lines

  1. """   QuArK  -  Quake Army Knife
  2.  
  3. Python macros available for direct call by QuArK
  4. """
  5.  
  6. #
  7. #$Header: /cvsroot/quark/runtime/plugins/entfgd2qrk.py,v 1.6 2003/12/17 13:58:59 peter-b Exp $
  8. #
  9.  
  10. import time, sys
  11.  
  12. class Key:
  13.     def __init__(self):
  14.         self.m_keyname = None
  15.         self.m_desc = ""
  16.         self.m_defaultvalue = None
  17.  
  18.     def SetKeyname(self, keyname):
  19.         self.m_keyname = keyname
  20.  
  21.     def SetDesc(self, desc):
  22.         self.m_desc = desc
  23.  
  24.     def SetDefaultValue(self, defvalue):
  25.         self.m_defaultvalue = defvalue
  26.  
  27.     def GetDefaultValue(self):
  28.         return self.m_defaultvalue
  29.  
  30.     def GenerateFolder(self, indent):
  31.         if (self.m_defaultvalue is None) or (self.m_defaultvalue == ""):
  32.             return None
  33.         indent[self.m_keyname] = str(self.m_defaultvalue)
  34.         return None
  35.  
  36.     def GenerateForm(self, indent):
  37.         return "This is pure virtual"
  38.  
  39.     def AddKeyFlag(self, value, desc, selected):
  40.         return "This is pure virtual"
  41.  
  42.     def AddKeyChoice(self, value, desc):
  43.         return "This is pure virtual"
  44.  
  45. class KeyString(Key):
  46.     def __init__(self):
  47.         Key.__init__(self)
  48.  
  49.     def GenerateForm(self, indent):
  50.         s = quarkx.newobj(self.m_keyname + ":")
  51.         s["txt"] = "&"
  52.         s["hint"] = self.m_desc
  53.         indent.appenditem(s)
  54.         return s
  55.  
  56. class KeyNumeric(Key):
  57.     def __init__(self):
  58.         Key.__init__(self)
  59.  
  60.     def GenerateForm(self, indent):
  61.         s = quarkx.newobj(self.m_keyname + ":")
  62.         s["txt"] = "&"
  63.         s["hint"] = self.m_desc
  64.         indent.appenditem(s)
  65.         return None
  66.  
  67. class KeyFlags(Key):
  68.     def __init__(self):
  69.         Key.__init__(self)
  70.         self.m_flags = []
  71.  
  72.     def AddKeyFlag(self, value, desc, selected):
  73.         self.m_flags = self.m_flags + [(value, desc)]
  74.         if (int(selected) > 0):
  75.             try:
  76.                 oldvalue = int(self.GetDefaultValue())
  77.             except:
  78.                 oldvalue = 0
  79.             self.SetDefaultValue(oldvalue + int(value))
  80.  
  81.     def GenerateForm(self, indent):
  82.         s = ""
  83.         nl = "" # no first newline
  84.         for value, desc in self.m_flags:
  85.           s = quarkx.newobj(self.m_keyname + ":")
  86.           s["txt"] = "&"
  87.           s["hint"] = ""
  88.           s["typ"] = "X"+value
  89.           s["cap"] = desc
  90.           indent.appenditem(s)
  91.         return None
  92.  
  93. class KeyChoices(Key):
  94.     def __init__(self):
  95.         Key.__init__(self)
  96.         self.m_choices = []
  97.  
  98.     def AddKeyChoice(self, value, desc):
  99.         self.m_choices = self.m_choices + [(value, desc)]
  100.  
  101.     def GenerateForm(self, indent):
  102.         s = quarkx.newobj(self.m_keyname + ":")
  103.         s["txt"] = "&"
  104.         s["hint"] = self.m_desc
  105.         s["typ"] = "C"
  106.         indent.appenditem(s)
  107.         it = ""
  108.         vl = ""
  109.         c = 0
  110.         for value, desc in self.m_choices:
  111.           it = it + desc
  112.           vl = vl + value
  113.           c = c + 1
  114.           if (c <> len(self.m_choices)):
  115.             it = it + "\r"
  116.             vl = vl + "\r"
  117.         s["items"] = it
  118.         s["values"] = vl
  119.         return None
  120.  
  121. ## --------
  122.  
  123. INHERITPREFIX = "t_"
  124.  
  125. class Entity:
  126.     def __init__(self):
  127.         self.m_classname = None
  128.         self.m_desc = ""
  129.         self.m_keys = []
  130.         self.m_inherit = []
  131.         self.m_size = None
  132.         self.m_color = None
  133.  
  134.     def Type(self):
  135.         raise "This is pure virtual"
  136.  
  137.     def SetClassname(self, classname):
  138.         self.m_classname = classname
  139.  
  140.     def SetDesc(self, desc):
  141.         self.m_desc = desc
  142.  
  143.     def SetSize(self, sizeargs):
  144.         if (len(sizeargs) == 6):
  145.             self.m_size = (float(sizeargs[0]), float(sizeargs[1]), float(sizeargs[2]),
  146.                            float(sizeargs[3]), float(sizeargs[4]), float(sizeargs[5]))
  147.  
  148.     def InheritsFrom(self, inherit):
  149.         self.m_inherit = self.m_inherit + [INHERITPREFIX + inherit]
  150.  
  151.     def AddKey(self, key):
  152.         self.m_keys = self.m_keys + [key]
  153.  
  154.     def TypeForm(self):
  155.         return ":form"
  156.  
  157.     def GetFolderStuff(self, s):
  158.         return ""
  159.  
  160.     def GenerateFolder(self, indent):
  161.         s = quarkx.newobj(self.m_classname + self.Type())
  162.         folder = indent
  163.         p = s.name.find("_")
  164.         if (p == -1):
  165.             folder = indent.findname("other entities.qtxfolder")
  166.             if (folder is None):
  167.                 folder = quarkx.newobj("other entities.qtxfolder")
  168.                 indent.appenditem(folder)
  169.         else:
  170.             folder = indent.findname(s.name[:p+1]+"* entities.qtxfolder")
  171.             if (folder is None):
  172.                 folder = quarkx.newobj(s.name[:p+1]+"* entities.qtxfolder")
  173.                 indent.appenditem(folder)
  174.         folder.appenditem(s)
  175.         self.GetFolderStuff(s)
  176.         s[";desc"] = self.m_desc
  177.         founddefaults = 0
  178.         for key in self.m_keys:
  179.             k = key.GenerateFolder(s)
  180.  
  181.     def GenerateForm(self, indent):
  182.         s = quarkx.newobj(self.m_classname + self.TypeForm())
  183.         if (self.m_size is not None):
  184.             s["bbox"] = self.m_size
  185.         for key in self.m_keys:
  186.             key.GenerateForm(s)
  187.         # Place "<keyword>=!"-statements at the _end_ of ":form" definitions, because of a problem which Decker found but can't solve.
  188.         for inh in self.m_inherit:
  189.             s.specificadd(inh+"=!")
  190.         indent.appenditem(s)
  191.  
  192. class BrushEntity(Entity):
  193.     def __init__(self):
  194.         Entity.__init__(self)
  195.  
  196.     def Type(self):
  197.         return ":b"
  198.  
  199.     def GetFolderStuff(self, s):
  200.         if (self.m_classname.lower() == "worldspawn"):
  201.             return
  202.         s["angle"] = "360"
  203.         s[";incl"] = "defpoly"
  204.  
  205. class PointEntity(Entity):
  206.     def __init__(self):
  207.         Entity.__init__(self)
  208.  
  209.     def Type(self):
  210.         return ":e"
  211.  
  212.     def GetFolderStuff(self, s):
  213.         s["angle"] = "360"
  214.         s["origin"] = "0 0 0"
  215.  
  216. class InheritEntity(Entity):
  217.     def __init__(self):
  218.         Entity.__init__(self)
  219.  
  220.     def SetClassname(self, classname):
  221.         self.m_classname = INHERITPREFIX + classname
  222.  
  223.     def GenerateFolder(self, indent):
  224.         return
  225.  
  226.     def Type(self):
  227.         return
  228.  
  229.     def TypeForm(self):
  230.         return ":incl"
  231.  
  232. ## --------
  233.  
  234. theEntities = []
  235. theEntity = None
  236. theKey = None
  237. currentclassname = None
  238. currentkeyname = None
  239. currentinherit = None
  240. currentinheritargs = None
  241. currentkeyflag = None
  242. currentkeychoice = None
  243.  
  244. def CreateClass(token):
  245.     global theEntity, theEntities
  246.     CloseClass("--CloseByCreateClass--")
  247.     # Create entity-type
  248.     if (token.lower() == "solidclass"):
  249.         theEntity = BrushEntity()
  250.     elif (token.lower() == "pointclass"):
  251.         theEntity = PointEntity()
  252.     elif (token.lower() == "baseclass"):
  253.         theEntity = InheritEntity()
  254.     else:
  255.         raise "Unknown @-token:", token
  256.  
  257. def CloseClass(token):
  258.     global theEntity, theEntities
  259.     # Add to large list of entities
  260.     if (theEntity is not None):
  261.         theEntities = theEntities + [theEntity]
  262.  
  263. def BeginInherit(token):
  264.     global currentinherit, currentinheritargs
  265.     EndInherit("--EndByBeginInherit--")
  266.     currentinherit = token.lower()
  267.     currentinheritargs = []
  268.  
  269. def AddInherit(token):
  270.     global currentinherit, currentinheritargs
  271.     currentinheritargs = currentinheritargs + [token]
  272.  
  273. def EndInherit(token):
  274.     global currentinherit, currentinheritargs, theEntity
  275.     if (currentinherit is None):
  276.         return
  277.     if (currentinherit == "base"):
  278.         for arg in currentinheritargs:
  279.             theEntity.InheritsFrom(arg)
  280.     elif (currentinherit == "size"):
  281.         theEntity.SetSize(currentinheritargs)
  282.     else:
  283.         pass
  284.     currentinherit = None
  285.  
  286. def BeginClassname(token):
  287.     global currentclassname, theEntity
  288.     EndClassname("--EndByBeginClassname--")
  289.     currentclassname = token
  290.     theEntity.SetClassname(token)
  291.  
  292. def AddClassnameDesc(token):
  293.     global theEntity
  294.     theEntity.SetDesc(token)
  295.  
  296. def EndClassname(token):
  297.     global currentclassname
  298.     if (currentclassname is None):
  299.         return
  300.     EndKey("--EndByEndClassname--")
  301.     currentclassname = None
  302.  
  303. def BeginKey(token):
  304.     global currentkeyname
  305.     EndKey("--EndByBeginKey--")
  306.     currentkeyname = token
  307.  
  308. def AddKeyType(token):
  309.     global currentkeyname, theKey
  310.     # Determine what type this key is, so the correct object can be created
  311.     token = token.lower()
  312.     if (token == "integer"):
  313.         theKey = KeyNumeric()
  314.     elif (token == "string" \
  315.        or token == "target_source" \
  316.        or token == "target_destination" \
  317.        or token == "color1" \
  318.        or token == "color255" \
  319.        or token == "studio" \
  320.        or token == "sound" \
  321.        or token == "sprite" \
  322.        or token == "decal"):
  323.         theKey = KeyString()
  324.     elif (token == "flags"):
  325.         theKey = KeyFlags()
  326.     elif (token == "choices"):
  327.         theKey = KeyChoices()
  328.     else:
  329.         raise "Unknown KeyType-token:", token
  330.     theKey.SetKeyname(currentkeyname)
  331.  
  332. def AddKeyDesc(token):
  333.     global theKey
  334.     theKey.SetDesc(token)
  335.  
  336. def AddKeyDefa(token):
  337.     global theKey
  338.     theKey.SetDefaultValue(token)
  339.  
  340. def AddKeyFlagNum(token):
  341.     global currentkeyflag
  342.     EndKeyFlag("--EndByAddKeyFlagNum--")
  343.     currentkeyflag = token
  344.  
  345. def AddKeyFlagDesc(token):
  346.     global currentkeyflag
  347.     value = currentkeyflag
  348.     currentkeyflag = (value, token)
  349.  
  350. def AddKeyFlagDefa(token):
  351.     global currentkeyflag
  352.     value, desc = currentkeyflag
  353.     currentkeyflag = (value, desc, token)
  354.  
  355. def EndKeyFlag(token):
  356.     global currentkeyflag, theKey
  357.     if (currentkeyflag is None):
  358.         return
  359.     value, desc, selected = currentkeyflag
  360.     theKey.AddKeyFlag(value, desc, selected)
  361.     currentkeyflag = None
  362.  
  363. def AddKeyChoiceNum(token):
  364.     global currentkeychoice
  365.     EndKeyChoice("--EndByAddKeyChoiceNum--")
  366.     currentkeychoice = token
  367.  
  368. def AddKeyChoiceDesc(token):
  369.     global currentkeychoice
  370.     value = currentkeychoice
  371.     currentkeychoice = (value, token)
  372.  
  373. def EndKeyChoice(token):
  374.     global currentkeychoice, theKey
  375.     if (currentkeychoice is None):
  376.         return
  377.     value, desc = currentkeychoice
  378.     theKey.AddKeyChoice(value, desc)
  379.     currentkeychoice = None
  380.  
  381. def EndKey(token):
  382.     global currentkeyname, theEntity, theKey
  383.     if (currentkeyname is None):
  384.         return
  385.     if (theKey is None or theEntity is None):
  386.         raise "Failure in EndKey()"
  387.     theEntity.AddKey(theKey)
  388.     currentkeyname = None
  389.  
  390. def EndKeyFlags(token):
  391.     EndKeyFlag("--EndByEndKeyFlags--")
  392.     EndKey(token)
  393.  
  394. def EndKeyChoices(token):
  395.     EndKeyChoice("--EndByEndKeyChoices--")
  396.     EndKey(token)
  397.  
  398. ## ------------
  399.  
  400. def readentirefile(file):
  401.     f = open(file, "r")
  402.     filecontents = ""
  403.     while 1:
  404.         line = f.readline()
  405.         if not line:
  406.             break
  407.         line = line.strip()
  408.         line = line.split("//")[0] # Remove end-of-line comments
  409.         if line:
  410.             filecontents = filecontents + line + "\n"
  411.     f.close()
  412.     return filecontents
  413.  
  414. TYPE_UNKNOWN    = 0
  415. TYPE_NUMERIC    = 1
  416. TYPE_STRING     = 2
  417. TYPE_SYMBOL     = 3
  418. TYPE_SPLITTER_AT        = 10    # '@'
  419. TYPE_SPLITTER_COLON     = 11    # ':'
  420. TYPE_SPLITTER_EQUAL     = 12    # '='
  421. TYPE_SPLITTER_SQUARE_B  = 13    # '['
  422. TYPE_SPLITTER_SQUARE_E  = 14    # ']'
  423. TYPE_SPLITTER_PRNTSHS_B = 15    # '('
  424. TYPE_SPLITTER_PRNTSHS_E = 16    # ')'
  425. TYPE_SPLITTER_COMMA     = 17    # ','
  426.  
  427. CHARS_NUMERIC  = "-0123456789."
  428. CHARS_STRING   = "\""
  429. CHARS_SPLITTER = "@:=[](),"
  430.  
  431. def getnexttoken(srcstring):
  432.     def nextnonwhitespace(srcstring):
  433.         i = 0
  434.         while (srcstring[i] in " \t\n\r"):
  435.             i = i + 1
  436.         return srcstring[i:]
  437.  
  438.     def gettoken(srcstring, delims=None):
  439.         token = ""
  440.         i = 0
  441.         if delims is None:
  442.             delims = " \t\n\r" + CHARS_SPLITTER
  443.         if not (srcstring[i] in delims):
  444.             token = token + srcstring[i]
  445.             i = i + 1
  446.         while not (srcstring[i] in delims):
  447.             token = token + srcstring[i]
  448.             i = i + 1
  449.         return token, srcstring[i:]
  450.  
  451.     token_is = TYPE_UNKNOWN
  452.     srcstring = nextnonwhitespace(srcstring)
  453.     if (not srcstring):
  454.         return None, TYPE_UNKNOWN, srcstring
  455.  
  456.     if (srcstring[0] in CHARS_NUMERIC):
  457.         token_is = TYPE_NUMERIC
  458.         token, srcstring = gettoken(srcstring)
  459.     elif (srcstring[0] in CHARS_STRING):
  460.         token_is = TYPE_STRING
  461.         token, srcstring = gettoken(srcstring[1:], CHARS_STRING)
  462.         srcstring = srcstring[1:] # Jump over the last " character
  463.     elif (srcstring[0] in CHARS_SPLITTER):
  464.         token = srcstring[0]
  465.         srcstring = srcstring[1:] # Jump over the splitter character
  466.         if (token == "@"):
  467.             token_is = TYPE_SPLITTER_AT
  468.         elif (token == ":"):
  469.             token_is = TYPE_SPLITTER_COLON
  470.         elif (token == "="):
  471.             token_is = TYPE_SPLITTER_EQUAL
  472.         elif (token == "["):
  473.             token_is = TYPE_SPLITTER_SQUARE_B
  474.         elif (token == "]"):
  475.             token_is = TYPE_SPLITTER_SQUARE_E
  476.         elif (token == "("):
  477.             token_is = TYPE_SPLITTER_PRNTSHS_B
  478.         elif (token == ")"):
  479.             token_is = TYPE_SPLITTER_PRNTSHS_E
  480.         elif (token == ","):
  481.             token_is = TYPE_SPLITTER_COMMA
  482.     else:
  483.         token_is = TYPE_SYMBOL
  484.         token, srcstring = gettoken(srcstring)
  485.     return token, token_is, srcstring
  486.  
  487.  
  488. statediagram =                                                                                  \
  489. {                                                                                               \
  490. # Current state            Token-type to go to ->    Next state             Function to call with token \
  491.  'STATE_UNKNOWN'        :[(TYPE_SPLITTER_AT        ,'STATE_CLASSBEGIN'     ,None)             ] \
  492.                                                                                                 \
  493. ,'STATE_CLASSBEGIN'     :[(TYPE_SYMBOL             ,'STATE_CLASSINHERIT'   ,CreateClass)      ] \
  494. ,'STATE_CLASSINHERIT'   :[(TYPE_SYMBOL             ,'STATE_INHERITBEGIN'   ,BeginInherit)       \
  495.                          ,(TYPE_SPLITTER_EQUAL     ,'STATE_CLASSNAME'      ,None)             ] \
  496.                                                                                                 \
  497. ,'STATE_INHERITBEGIN'   :[(TYPE_SPLITTER_PRNTSHS_B ,'STATE_INHERITMEDIUM'  ,None)             ] \
  498. ,'STATE_INHERITMEDIUM'  :[(TYPE_SYMBOL             ,'STATE_INHERITMEDIUM'  ,AddInherit)         \
  499.                          ,(TYPE_NUMERIC            ,'STATE_INHERITMEDIUM'  ,AddInherit)         \
  500.                          ,(TYPE_STRING             ,'STATE_INHERITMEDIUM'  ,AddInherit)         \
  501.                          ,(TYPE_SPLITTER_COMMA     ,'STATE_INHERITMEDIUM'  ,None)               \
  502.                          ,(TYPE_SPLITTER_PRNTSHS_E ,'STATE_CLASSINHERIT'   ,EndInherit)       ] \
  503.                                                                                                 \
  504. ,'STATE_CLASSNAME'      :[(TYPE_SYMBOL             ,'STATE_CLASSNAME2'     ,BeginClassname)   ] \
  505. ,'STATE_CLASSNAME2'     :[(TYPE_SPLITTER_COLON     ,'STATE_CLASSNAME3'     ,None)               \
  506.                          ,(TYPE_SPLITTER_SQUARE_B  ,'STATE_KEYSBEGIN'      ,None)             ] \
  507. ,'STATE_CLASSNAME3'     :[(TYPE_STRING             ,'STATE_CLASSNAME4'     ,AddClassnameDesc) ] \
  508. ,'STATE_CLASSNAME4'     :[(TYPE_SPLITTER_SQUARE_B  ,'STATE_KEYSBEGIN'      ,None)             ] \
  509.                                                                                                 \
  510. ,'STATE_KEYSBEGIN'      :[(TYPE_SPLITTER_SQUARE_E  ,'STATE_UNKNOWN'        ,EndClassname)       \
  511.                          ,(TYPE_SYMBOL             ,'STATE_KEYBEGIN'       ,BeginKey)         ] \
  512.                                                                                                 \
  513. ,'STATE_KEYBEGIN'       :[(TYPE_SPLITTER_PRNTSHS_B ,'STATE_KEYTYPE'        ,None)             ] \
  514. ,'STATE_KEYTYPE'        :[(TYPE_SYMBOL             ,'STATE_KEYTYPE2'       ,AddKeyType)       ] \
  515. ,'STATE_KEYTYPE2'       :[(TYPE_SPLITTER_PRNTSHS_E ,'STATE_KEYTYPE3'       ,None)             ] \
  516. ,'STATE_KEYTYPE3'       :[(TYPE_SPLITTER_EQUAL     ,'STATE_VALUEFLAGS'     ,None)               \
  517.                          ,(TYPE_SPLITTER_COLON     ,'STATE_VALUE'          ,None)               \
  518.                          ,(TYPE_SYMBOL             ,'STATE_KEYBEGIN'       ,BeginKey)           \
  519.                          ,(TYPE_SPLITTER_SQUARE_E  ,'STATE_UNKNOWN'        ,EndClassname)     ] \
  520.                                                                                                 \
  521. ,'STATE_VALUEFLAGS'     :[(TYPE_SPLITTER_SQUARE_B  ,'STATE_VALUEFLAGS2'    ,None)             ] \
  522. ,'STATE_VALUEFLAGS2'    :[(TYPE_SPLITTER_SQUARE_E  ,'STATE_KEYSBEGIN'      ,EndKeyFlags)        \
  523.                          ,(TYPE_NUMERIC            ,'STATE_VALUEFLAG'      ,AddKeyFlagNum)    ] \
  524. ,'STATE_VALUEFLAG'      :[(TYPE_SPLITTER_COLON     ,'STATE_VALUEFLAG2'     ,None)             ] \
  525. ,'STATE_VALUEFLAG2'     :[(TYPE_STRING             ,'STATE_VALUEFLAG3'     ,AddKeyFlagDesc)   ] \
  526. ,'STATE_VALUEFLAG3'     :[(TYPE_SPLITTER_COLON     ,'STATE_VALUEFLAG4'     ,None)             ] \
  527. ,'STATE_VALUEFLAG4'     :[(TYPE_NUMERIC            ,'STATE_VALUEFLAGS2'    ,AddKeyFlagDefa)   ] \
  528.                                                                                                 \
  529. ,'STATE_VALUE'          :[(TYPE_STRING             ,'STATE_VALUE2'         ,AddKeyDesc)       ] \
  530. ,'STATE_VALUE2'         :[(TYPE_SYMBOL             ,'STATE_KEYBEGIN'       ,BeginKey)           \
  531.                          ,(TYPE_SPLITTER_SQUARE_E  ,'STATE_UNKNOWN'        ,EndClassname)       \
  532.                          ,(TYPE_SPLITTER_COLON     ,'STATE_VALUE3'         ,None)               \
  533.                          ,(TYPE_SPLITTER_EQUAL     ,'STATE_CHOICES'        ,None)             ] \
  534. ,'STATE_VALUE3'         :[(TYPE_NUMERIC            ,'STATE_VALUE4'         ,AddKeyDefa)         \
  535.                          ,(TYPE_STRING             ,'STATE_VALUE4'         ,AddKeyDefa)       ] \
  536. ,'STATE_VALUE4'         :[(TYPE_SYMBOL             ,'STATE_KEYBEGIN'       ,BeginKey)           \
  537.                          ,(TYPE_SPLITTER_SQUARE_E  ,'STATE_UNKNOWN'        ,EndClassname)       \
  538.                          ,(TYPE_SPLITTER_EQUAL     ,'STATE_CHOICES'        ,None)             ] \
  539.                                                                                                 \
  540. ,'STATE_CHOICES'        :[(TYPE_SPLITTER_SQUARE_B  ,'STATE_CHOICES2'       ,None)             ] \
  541. ,'STATE_CHOICES2'       :[(TYPE_SPLITTER_SQUARE_E  ,'STATE_KEYSBEGIN'      ,EndKeyChoices)      \
  542.                          ,(TYPE_NUMERIC            ,'STATE_CHOICES3'       ,AddKeyChoiceNum)  ] \
  543. ,'STATE_CHOICES3'       :[(TYPE_SPLITTER_COLON     ,'STATE_CHOICES4'       ,None)             ] \
  544. ,'STATE_CHOICES4'       :[(TYPE_STRING             ,'STATE_CHOICES2'       ,AddKeyChoiceDesc) ] \
  545. }
  546.  
  547. import quarkpy.qutils
  548. import quarkx
  549.  
  550. def makeqrk(root, filename, gamename):
  551.     quarkx.msgbox("Please note, this is not always 100% accurate and will duplicate\nexisting entities and possibly miss some out.\n\nYou may need to handedit the .qrk file. For help with this,\nfeel free to ask questions at the QuArK forum:\n\nhttp://groups.yahoo.com/group/quark/messages\n", quarkpy.qutils.MT_INFORMATION, quarkpy.qutils.MB_OK)
  552.     global currentclassname
  553.     srcstring = readentirefile(filename)
  554.     state = 'STATE_UNKNOWN'
  555.     while (len(srcstring) > 1):
  556.         token, token_is, srcstring = getnexttoken(srcstring)
  557.         # Figure out, if the token_is type is expected or not
  558.         expectedtypes = []
  559.         newstate = None
  560.         typestates = statediagram[state]
  561.         for type, nextstate, func in typestates:
  562.             if (type == token_is):
  563.                 # We found the correct token type, now remember what new state we're going into
  564.                 newstate = nextstate
  565.                 break
  566.             expectedtypes = expectedtypes + [type]
  567.         if newstate is None:
  568.             print "Parse error: Got type", token_is, "but expected type(s);", expectedtypes
  569.             print "Debug: Last classname was =", currentclassname
  570.             print "Debug:", srcstring[:64]
  571.             raise "Parse error!"
  572.         if (func is not None):
  573.             # This state have a function attached to it. Call it giving it the found token.
  574.             func(token)
  575.         # Change to new state
  576.         state = newstate
  577.     CloseClass("--EndByEOF--")
  578.     indent = 2
  579.     r_tbx = quarkx.newobj("Toolbox Folders.qtx")
  580.     r_tbx["Toolbox"] = "New map items..."
  581.     r_tbx.flags = r_tbx.flags | quarkpy.qutils.OF_TVSUBITEM
  582.     root.appenditem(r_tbx)
  583.  
  584.     e_tbx = quarkx.newobj("Entities for "+gamename+".qtxfolder")
  585.     e_tbx[";desc"] = "Created from "+filename
  586.     r_tbx.appenditem(e_tbx)
  587.  
  588.     r_tbx["Root"] = e_tbx.name
  589.  
  590.     for ent in theEntities:
  591.         ent.GenerateFolder(e_tbx)
  592.  
  593.     f_tbx = quarkx.newobj("Entity Forms.fctx")
  594.     f_tbx.flags = f_tbx.flags | quarkpy.qutils.OF_TVSUBITEM
  595.     root.appenditem(f_tbx)
  596.  
  597.     for ent in theEntities:
  598.         ent.GenerateForm(f_tbx)
  599.     root.refreshtv()
  600.  
  601.     quarkx.msgbox("The .FGD file have now almost been converted to QuArK format.\n\nWhat remains is to save it as a 'Structured text for hand-editing (*.qrk)' file, then using a text-editor do a Search-Replace of   \"!\"   with   !\nE.g. replacing a double-quoted exclamation mark, with just a exclamation mark.\n\nIf you encounter any problems using this 'Convert from Worldcraft .FGD file' utility, please post a mail in the QuArK-forum.", quarkpy.qutils.MT_INFORMATION, quarkpy.qutils.MB_OK)
  602.  
  603. import quarkpy.qentbase
  604. quarkpy.qentbase.RegisterEntityConverter("Worldcraft .fgd file", "Worldcraft .fgd file", "*.fgd", makeqrk)
  605.  
  606. #
  607. #$Log: entfgd2qrk.py,v $
  608. #Revision 1.6  2003/12/17 13:58:59  peter-b
  609. #- Rewrote defines for setting Python version
  610. #- Removed back-compatibility with Python 1.5
  611. #- Removed reliance on external string library from Python scripts
  612. #
  613. #Revision 1.5  2002/02/05 18:32:58  decker_dk
  614. #Corrected a problem with debug() calls
  615. #
  616. #Revision 1.4  2001/12/02 09:57:45  decker_dk
  617. #Removing 'os' from the import list, and some other minor fixes.
  618. #
  619. #Revision 1.3  2001/10/21 08:34:42  decker_dk
  620. #Print out debug-information, in case of parse-error.
  621. #
  622. #Revision 1.2  2001/08/13 17:45:30  decker_dk
  623. #Problem with "<keyword>=!" placements in ":form" definitions. Hard to solve correctly, as its deep within QuArK's Delphi-code!
  624. #
  625. #Revision 1.1  2001/06/13 23:02:50  aiv
  626. #Moved 'Convert From' stuff to python code (plugin type)
  627. #
  628. #Revision 1.4  2001/06/11 17:42:38  decker_dk
  629. #Fixed the BBOX problem, where it would think the value were a string (double-quotes), and not 6 numbers (single-quotes).
  630. #Also added a messagebox which states what should be manually done afterwards.
  631. #
  632. #Revision 1.3  2001/04/14 19:30:58  decker_dk
  633. #Handle 'color1' FGD-types too.
  634. #
  635. #
  636.